#ifndef __LINKEDLIST_H__
#define __LINKEDLIST_H__

// 数据节点
typedef struct list_t {
    void *data;             // 数据域
    struct list_t *next;    // 指针域
} list_t;

// 头节点
typedef struct listhead_t {
    // 为了访问时让头节点和数据节点类型一致（可以强转）
    list_t node;         // 节点的 data 域不使用，只用 next 指针
    int size;            // 链表存储的元素的 sizeof
} listhead_t;

typedef int (*cmp_t)(const void *data, const void *key);
typedef void (*pri_t)(const void *data);

// 初始化头节点
int listhead_init(listhead_t **list, int size);

// 增加节点（头插）
int list_insert(listhead_t *list, const void *data);

// 增加节点（尾插）
int list_insert_tail(listhead_t *list, const void *data);

// 链表是否为空
int list_empty(const listhead_t *list);

// 找节点
void *list_find(const listhead_t *list, const void *key, cmp_t cmp);

// 删除节点
int list_delete(listhead_t *list, const void *key, cmp_t cmp);

// 遍历
void list_traval(const listhead_t *list, pri_t pri);

// 销毁
void list_destroy(listhead_t **list);

#endif
